/***********************************************************************************
 * 文件名： mcu_adc.c
 * 版本： 2
 * 说明：
 * 		SC8 系列 的ADC外设驱动。使用说明见头文件。在 sc8_driver_config.h 文件中可配置初始状态。
 * 修改记录：
 * 	2021/04/28: 初版。 刘言。
 *  2022/01/21：兼容SC8P171xE系列
 ***********************************************************************************/
#include "mcu_adc.h"

static bit _Adc_mADIEBuff;

#if SC8P_MCU_TYPE == SC8P1715

u8 Adc_GetOnce(u8 ch)
{
    _Adc_mADIEBuff = ADIE;
    ADIE = 0;
    ADCON0 &= 0XC3;
    ADCON0 |= (ch << 2);
    GODONE = 1;
    while (GODONE == 1);
    ADIE = _Adc_mADIEBuff;
    return ADRESH;
}

#elif SC8P_MCU_TYPE == SC8P171xE

u8 Adc_mAdcFEC;

u8 Adc_GetOnce(u8 ch)
{
    GODONE = 0;

    _Adc_mADIEBuff = ADIE;
    ADIE = 0;
    ADCON0 &= 0XC3;
    ADCON0 |= (ch << 2);
    __delay_us(ADC_DELAY);
    GODONE = 1;
    unsigned char i = 0;
    while (GODONE)
    {
        i++;
        if (i > 100)
        {
            // 转换超时 关闭ADC 重新来
            i = 0;
            ADON = 0;
            GODONE = 0;
            ADON = 1;
            __delay_us(ADC_DELAY);
            GODONE = 1;
        }
    }
    ADIE = _Adc_mADIEBuff;
    return ADRESH;
}

// 使用ADC中断时，需要纠错 建议100us定时调用
void Adc_EvTimingFEC()
{
    if (GODONE)
    {
        Adc_mAdcFEC++;
        if (Adc_mAdcFEC == 3)
        {
            // 关闭ADC 重新开启
            Adc_Disable();
            GODONE = 0;
            Adc_Enable();
            __delay_us(ADC_DELAY);
            GODONE = 1;
            Adc_mAdcFEC = 0;
        }
    }
}

#elif SC8P_MCU_TYPE == SC8F577x

u8 Adc_mAdcFEC;

u8 Adc_GetOnce(u8 ch)
{
    GODONE = 0;

    _Adc_mADIEBuff = ADIE;
    ADIE = 0;

    CHS4 = ((ch)&0x10) >> 4;
    ADCON0 &= 0XC3;
    ADCON0 |= (ch << 2);
    __delay_us(ADC_DELAY);
    GODONE = 1;

    unsigned char i = 0;
    while (GODONE)
    {
        i++;
        if (i > 100)
        {
            // 转换超时 关闭ADC 重新来
            i = 0;
            ADON = 0;
            GODONE = 0;
            ADON = 1;
            __delay_us(ADC_DELAY);
            GODONE = 1;
        }
    }
    ADIE = _Adc_mADIEBuff;
    return ADRESH;
}

// 使用ADC中断时，需要纠错 建议100us定时调用
void Adc_EvTimingFEC()
{
    if (GODONE)
    {
        Adc_mAdcFEC++;
        if (Adc_mAdcFEC == 3)
        {
            // 关闭ADC 重新开启
            Adc_Disable();
            GODONE = 0;
            Adc_Enable();
            __delay_us(ADC_DELAY);
            GODONE = 1;
            Adc_mAdcFEC = 0;
        }
    }
}

#endif
